package cn.starrysky108.simpleerp.user.service;

import cn.starrysky108.simpleerp.system.entity.SystemPermission;
import cn.starrysky108.simpleerp.system.entity.SystemRole;
import cn.starrysky108.simpleerp.user.entity.OnlineDeviceInfo;
import cn.starrysky108.simpleerp.user.entity.User;
import cn.starrysky108.simpleerp.pub.response.TokenResponse;
import cn.starrysky108.simpleerp.user.vo.UserVo;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户信息表 服务类
 * </p>
 *
 * @author Carl Lee
 */
public interface UserService extends IService<User> {

    /**
     * 根据用户名进行查询用户信息，用户密码进行隐藏
     *
     * @param username 用户名
     * @return User
     */
    User getUser(String username);
    /**
     * 根据用户id进行查询用户信息
     *
     * @param id 用户名
     * @return UserVo
     */
    UserVo getUserVo(Long id);

    /**
     * 根据用户id查询所有角色
     *
     * @param userId 用户id
     * @return 角色列表roles
     */
    List<SystemRole> listRoleByUserId(Long userId);

    /**
     * 根据用户id查询用户权限
     *
     * @param userId 用户id
     * @return 权限列表
     */
    List<SystemPermission> listPermissionByUserId(Long userId);

    /**
     * 获取refresh_token
     *
     * @param refreshToken 旧token
     * @param request      HttpServletRequest
     * @param response     HttpServletResponse
     * @return TokenResponse
     */
    TokenResponse getToken(String refreshToken, HttpServletRequest request, HttpServletResponse response);

    /**
     * 注册
     *
     * @param user     用户信息
     * @param response HttpServletResponse
     * @return TokenResponse
     */
    TokenResponse register(User user, HttpServletResponse response);

    /**
     * 退出登录
     *
     * @param accessToken  accessToken
     * @param refreshToken refreshToken
     */
    void logout(String accessToken, String refreshToken);

    /**
     * 列出当前用户的所有在线设备
     *
     * @param userId 用户id
     * @return deviceList
     */
    Map<String, OnlineDeviceInfo> listOnlineDevice(Long userId);


}
